﻿Public Class frmLicense
    Public check_state As Integer = 0

    Private Const mac_found_error As String = "Произошла ошибка определения MAC адреса." & vbNewLine & "Попробуйте заново, если не поможет, то обратитесь к разработчику."
    Private Const server_is_down As String = "Ошибка получения данных. Возможно отсутствует подключение к интернету." & vbNewLine & "Попробуйте заново, если не поможет, то обратитесь к разработчику."
    Private Const license_not_found As String = "Ваш лицензионный ключ не верный." & vbNewLine & "Получите новый лицензионный ключ."
    Private Const mac_not_correctly As String = "Данная программа может использоваться только на одном компьютере." & vbNewLine & "Если вы желаете использовать программу на другом компьютере обратитесь к разработчику."
    Private Const date_wrong As String = "Срок лицензии вашего ключа истёк." & vbNewLine & "Получите новый лицензионный ключ у разработчика."
    Private Const license_correct As String = "Ваш лицензионный ключ был принят." & vbNewLine & "Можно продолжать работу."

    Private license As String
    Private mac As String

    Private last_check As Boolean


    Public Sub Init()
        'Программа только загружается
        check_state = 0

        'Получаем MAC адрес
        Dim mac_info As System.Net.NetworkInformation.NetworkInterface = Nothing
        Try
            For Each mac_info In System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces
                mac = mac_info.GetPhysicalAddress.ToString
                If mac <> "" Then
                    Exit Try
                End If
            Next
            'Ошибка определения MAC адреса
        Catch ex As Exception
        End Try

        'Получаем лицензионный ключ
        If license = "" Then
            license = GetINIString("Main", "license")
        End If
    End Sub


    Private Sub frmLicense_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
        mtxtLicense.Text = license
    End Sub


    Private Sub frmLicense_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    End Sub


    Private Sub frmLicense_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If e.CloseReason = CloseReason.UserClosing Then
            If last_check = False Then
                'e.Cancel = True
                End
            End If
        End If
    End Sub



    Private Sub btnCheckLicense_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCheckLicense.Click
        license = mtxtLicense.Text
        If Me.CheckLicense() = 0 Then
            MsgBox(license_correct, MsgBoxStyle.Information)
            Me.Close()
        End If
    End Sub



    Public Function CheckLicense() As Integer
        'Получаем данные с сервера
        Dim wbc As New System.Net.WebClient
        Dim response As String
        Dim url As String = "http://advertsgrabber.esy.es/index.php?s1=" & license & "&s2=" & mac
        Try : response = wbc.DownloadString(url)
        Catch ex As Exception
            MsgBox(server_is_down, MsgBoxStyle.Critical)
            CheckLicense = 500
            last_check = False
            Exit Function
        End Try

        'Проверяем полученные даные
        CheckLicense = 0
        Select Case response
            Case "1", "500" 'ошибка сервера
                MsgBox(server_is_down, MsgBoxStyle.Critical)
                CheckLicense = 1
            Case "2" 'лицензия не найдена
                MsgBox(license_not_found, MsgBoxStyle.Critical)
                CheckLicense = 2
            Case "3" 'MAC не верный
                MsgBox(mac_not_correctly, MsgBoxStyle.Critical)
                CheckLicense = 3
            Case "4" 'срок лицензии ключа истёк
                MsgBox(date_wrong, MsgBoxStyle.Critical)
                CheckLicense = 4
            Case Else
                If getResponseEqual(response, Now) = False Then
                    If getResponseEqual(response, DateAdd(DateInterval.Day, -1, Now)) = False Then
                        MsgBox(license_not_found, MsgBoxStyle.Critical)
                        CheckLicense = 2
                    End If
                End If
        End Select

        If CheckLicense = 0 Then
            last_check = True
        Else
            last_check = False
        End If
    End Function


    Private Function getResponseEqual(ByVal response As String, ByVal dat As Date) As Boolean
        Dim md5hash As String = ToMD5String(license & mac).ToUpper()
        Dim day As String = dat.Day.ToString("x2").ToUpper()
        Dim month As String = dat.Month.ToString("x2").ToUpper()
        Dim year As String = CInt(dat.Year.ToString().Substring(2, 2)).ToString("x2").ToUpper()
        'день + первый символ года + хеш(лицензия+мак) + 2й символ года + месяц
        md5hash = day & year.Substring(0, 1) & md5hash & year.Substring(1, 1) & month
        If response.Length <> md5hash.Length Then Return False
        For i As Integer = 0 To md5hash.Length - 1
            If response(i) <> md5hash(i) Then Return False 'прямой порядок
            'If response(response.Length - 1 - i) <> md5hash(i) Then Return False 'обратный порядок
        Next
        Return True
    End Function
End Class